package bavaria.hightech.banking;



public class Money {
	
	public enum Waehrung {
		EURO(14458L), DOLLAR(69171L); //Kurs als long nicht als Flieskomma, wegen rundungsfehlern
		
		public long kurs;
		
		private Waehrung(long kurs) {
			this.kurs = kurs;
		}
		
		public long getKurs(){
			return this.kurs;
		}
		

	}
	
	private long betrag; //in Cent
	private Waehrung waehrung;
	
	public Money(long betrag, Waehrung waehrung) {
		this.betrag = betrag;
		this.waehrung = waehrung;
	}
	
	public void addieren(Money m){
		if(this.waehrung == m.getWaehrung()){
			this.betrag += m.getBetrag();
		}else{
			this.betrag += m.umrechnen(this.getWaehrung());
		}
		
	}
	
	public void subtrahieren(Money m){
		if(this.waehrung == m.getWaehrung()){
			this.betrag -= m.getBetrag();
		}else{
			this.betrag -= m.umrechnen(this.getWaehrung());
		}
	}
	
	public boolean equals(Object o){
		if(o instanceof Money){
			Money tmp = (Money)o;
			if(tmp.getBetrag() == this.getBetrag() && tmp.getWaehrung() == this.getWaehrung()){
				return true;
			}
		}
		return false;
	}
	
	public boolean istGroesser(Money m){
		// falls das uebergebene Money die gleiche Waehrung hat und kleiner ist als das referenzierte true zurueckgeben.
		if(this.equals(m) && this.betrag > m.getBetrag()){
			return true;
		}
		else{ //falls das uebergebene Money eine andere Waehrung hat diese umrechnen und ueberpruefen.
			long tempBetrag = m.umrechnen(this.getWaehrung());
			if(this.betrag > tempBetrag){
				return true;
			}
		}
		return false;
	}
	
	public long getBetrag(){
		return this.betrag;
	}
	
	public Waehrung getWaehrung(){
		return this.waehrung;
	}
	
	public long umrechnen(Waehrung w){
		
		switch (w) {
		case EURO:
			return (this.betrag * this.getWaehrung().getKurs()) / 100000;
		case DOLLAR:
			return (this.betrag * this.getWaehrung().getKurs() / 10000);
		default:
			return 0;
		}
		
		
	}
	
	

}
